package com.itheima.modifier1;

import com.itheima.modifier.Father;

public class Child extends Father {

    //其他包的子类
    public void show() {
        //privateMethod();     //报错
        //defaultMethod();     //报错
        protectedMethod();
        publicMethod();

        Father father = new Father();
        //father.privateMethod();     //报错
        //father.defaultMethod();     //报错
        //father.protectedMethod();   //报错：原因如下：
        /*
        在Java中，`protected`修饰符意味着一个成员（如方法或变量）可以被以下情况访问：
            1. 同一包内的任何类。
            2. 不同包内的子类，即使子类不在同一个包中。

        然而，当您在子类中直接创建父类的一个实例并尝试调用`protected`方法时，访问规则就受到更严格的限制。在这种情况下，访问仅限于同一包内。

        因此，尽管`protected`方法可以从子类中访问，但这指的是在子类的代码体内间接访问，而不是通过不同包中的子类实例显式创建父类对象并调用该方法。

        所以，在您的示例中，由于`Child`类和`Father`类不在同一个包中，当您在`Child`类中创建`Father`类的实例并尝试调用`protectedMethod()`时，这会违反`protected`的访问规则，因为此时`Child`和`Father`实例被视为不同的包中的独立实体。

        正确的做法是在`Child`类内部通过继承直接使用`protected`方法，或者如果需要在子类中显式调用，确保子类和父类位于同一包中。如果确实需要跨包访问，可以考虑将方法修改为`public`，或者重构代码设计来满足封装和访问控制的原则。
         */
        father.publicMethod();
    }

}
